package cn.springBoot.service.impl;

import cn.springBoot.dao.UserDao;
import cn.springBoot.entity.User;
import cn.springBoot.service.UserService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;


import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ljx
 * @since 2020-01-16
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
      @Autowired
	  private UserDao dao;

	    /**
	     * @discription   "@Cacheable"标注的方法执行之前先来检查缓存中有没有这个数据，
	              * 默认按照参数的值作为key去查询缓存，如果没有就运行方法并将结果放入缓存；以后再来调用就可以直接使用缓存中的数据；
	               核心：
         *      1）、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件
         *      2）、key使用keyGenerator生成的，默认是SimpleKeyGenerator
	     * @author ljx
	     * @created 2020年10月12日 下午3:30:07
	     * @param id
	     * @return
	     * @see cn.springBoot.service.UserService#selectByIda(int)
	     */


	@Cacheable(value = {"user"}, key = "#id")
	public User selectByIda(int id) {

		return dao.selectByIda(id);


	}
	/**
	 *
	     * @discription '@CachePut'：既调用方法，又更新缓存数据；同步更新缓存 * 修改了数据库的某个数据，同时更新缓存；
                        * 运行时机：
         *  1、先调用目标方法
         *  2、将目标方法的结果缓存起来
         *
	     * @author ljx
	     * @created 2020年10月15日 下午12:30:47
	     * @param user
	     * @return
	 */

    @CachePut(value = "user", key = "#user.id")
    public User updateUser(User user){
        System.out.println("updateUser:"+user);
        dao.updateUser(user);
        return user;
    }

	    /**
	     * @discription  '@CacheEvict' 删除缓存
	     * @author ljx
	     * @created 2020年10月15日 下午4:15:53
	     * @param id
	     * @return
	     * @see cn.springBoot.service.UserService#delUser(java.lang.Integer)
	     */

    @CacheEvict(value="user",key = "#id")
	public String delUser(Integer id) {
    	dao.deleteUserById(id);
		return "success";
	}





}
